#ifndef GAMEMANAGER_H
#define GAMEMANAGER_H

#include "core/GameState.h"
#include "util/DataTraveler.h"

#include <string>
#include <vector>

#include <SDL/SDL.h>
#include "SDL/SDL_ttf.h"

namespace eats_core {

// TODO (Eusyar#1#) Criar uma classe responsavel por ler os dados criar as classes corretamente

/**
 * @brief Classe responsável para servir como um gerente do jogo. Conhece os estados do jogo
 * e a maneiro com que se deve trocar entre eles. Ele não deve existir fora de um conteiner.
 *
 * @autor Eusyar Alves
 */
class GameManager
{
    public:

        /**
         * @brief Construtor privado de um gameManager. É possível chama-lo apenas
         * através do método construtor da classe GameManager.
         *
         * @param _state, primeira fase para o jogo. Normalmente menu ou apresentacao.
         * @autor Eusyar Alves
         */
        GameManager(int sizeW = 800 , int sizeH = 600, GameState * state = NULL);
        virtual ~GameManager(){};

        /**
         * @brief Laço principal do game. Para sair desse laço o game deve para o estado.
         *
         * @return 0 para caso a execução tenha terminado corretamente, -1 para o contrário
         * @autor Eusyar Alves
         */
        int execute() ;

        /**
		 * @brief Incializa o game. Inicia a SDL e inicia uma janela _core_surface.
		 *
		 * @return false caso não consiga iniciar SDL || _core_surface
		 * @autor Eusyar Alves
		 */
		bool setUp() ;

		/**
		 * @brief Finaliza o game. Finaliza qualquer gamestate que não estiver em estado == idle
		 *
		 * @autor Eusyar Alves
		 */
		void tearDown();

        /**
         * @brief adiciona determinado state para o vector do de states.
         *
         * @param state a ser adicionado no final da fila
         */
        int statePush(GameState * state);

        /**
         * @brief retorna determinado state apartir da posição x na lista.
         *
         * @param posição a ser pega
         */
        GameState * getState(int x);

        /**
		 * @brief Principal tela. Surface usada como plano de fundo para todo o game.
		 */
		SDL_Surface *  _core_surface;

    public:

        /**
         * @brief Atual fase em execução.
         */
        GameState * _current_state;

        bool turnOFF()
        {
        	_running = false;
        	return true;
        }

        int getWidthSize() {
        	return _sizeW;
        }

        int getHeighSize() {
        	return _sizeH;
        }

    private:

        bool sdlSetUp();
        bool videoSetUp();
        bool audioSetUp();
        bool ttfSetUp();

        bool disableComponent(GameState * ref);

    private:

        /**
         * @brief Variável que define indica se o game está rodando.
         */
        bool _running;

        /**
         * @brief Tamanho da janela.
         */
        int _sizeW, _sizeH;

        /**
         * @brief Variável que contém todas as fases do jogo.
         */
        std::vector< GameState * > statesList;

};

}

#endif // GAMEMANAGER_H
